/*
? Object.freeze()  是 JavaScript 中的一个方法，它用于冻结一个对象，使其不可更改。
? 一旦一个对象被冻结，就不能再添加、删除或修改其属性或方法。这可以帮助我们确保对象的不可变性，从而提高代码的可靠性和安全性。
? 肯定是使用defineProperty了
 */

const _objectFreeze = object => {
    //? 类型判断
    if(typeof object !== 'object' || object === null) {
        throw new TypeError(`the ${object} is not a object`)
    }
    //? 拿键
    const keys = Object.getOwnPropertyNames(object)
    //? 返回所有符号属性的数组
    const symbols = Object.getOwnPropertySymbols(object)
    //? 符号属性也要加入遍历
    ;[...keys, ...symbols].forEach(key => {
        //? 使用defineProperty来冻结
        Object.defineProperty(object, key, {
            //? 不可配置
            //? 该属性的类型不能在数据属性和访问器属性之间更改，且
            //? 该属性不可被删除，且
            //? 其描述符的其他属性也不能被更改（但是，如果它是一个可写的数据描述符，则 value （与属性相关联的值）可以被更改，writable 可以更改为 false）
            configurable: false,
            //? 不可写 不可以使用赋值运算符更改
            writable: false,
        })
    })
    //? 防止对象在运行时被扩展，即该对象将被标记为不可扩展，并且无法添加新的属性或方法。但是，现有的属性和方法仍然可以被修改或删除(前面配置了不可写了)。
    Object.preventExtensions(object)
}
